/*
 * $Id$
 */
package py.windmill.util;

import com.eclipsesource.json.JsonArray;
import com.eclipsesource.json.JsonObject;
import com.eclipsesource.json.JsonValue;
import java.util.Iterator;

/**
 *
 * @author myang
 */
public class JsonUtil {

    /**
     *
     * @param obj
     * @param name
     * @return
     */
    public static String string(final JsonObject obj, final String name) {
        return string(obj, name, null);
    }

    /**
     *
     * @param obj
     * @param name
     * @param defaultValue
     * @return
     */
    public static String string(final JsonObject obj,
            final String name, final String defaultValue) {
        return string(obj.get(name), defaultValue);
    }

    /**
     *
     * @param array
     * @param index
     * @return
     */
    public static String string(final JsonArray array, final int index) {
        return string(array, index, null);
    }

    /**
     *
     * @param array
     * @param index
     * @param defaultValue
     * @return
     */
    public static String string(final JsonArray array,
            final int index, final String defaultValue) {
        return string(array.get(index), defaultValue);
    }

    /**
     *
     * @param val
     * @return
     */
    public static String string(final JsonValue val) {
        return string(val, null);
    }

    /**
     *
     * @param val
     * @param defaultValue
     * @return
     */
    public static String string(final JsonValue val, final String defaultValue) {
        return null != val && val.isString() ? val.asString() : defaultValue;
    }

    /**
     *
     * @param obj
     * @param name
     * @return
     */
    public static JsonArray array(final JsonObject obj, final String name) {
        return array(obj, name, null);
    }

    /**
     * 
     * @param obj
     * @param name
     * @return 
     */
    public static JsonArray array(final JsonObject obj, final String name, 
                                   final JsonArray defaultArray) {
        return array(obj.get(name), defaultArray);
    }

    /**
     *
     * @param array
     * @param index
     * @return
     */
    public static JsonArray array(final JsonArray array, final int index) {
        return array(array.get(index));
    }

    /**
     *
     * @param val
     * @return
     */
    public static JsonArray array(final JsonValue val) {
        return array(val, null);
    }

    /**
     * 
     * @param val
     * @param defaultArray
     * @return 
     */
    public static JsonArray array(final JsonValue val,
                                   final JsonArray defaultArray) {
        return null != val && val.isArray() ? val.asArray() : defaultArray;
    }

    /**
     * 
     * @param obj
     * @param defaultValue
     * @return 
     */
    public static KeyValue<String, JsonValue> first(final JsonObject obj) {
        final Iterator<JsonObject.Member> it = obj.iterator();
        if (it.hasNext()) {
            final JsonObject.Member m = it.next();
            return KeyValue.pair(m.getName(), m.getValue());
        }
        return null;
    }

    public static KeyValue<String, JsonValue> first(final JsonValue obj) {
        if (obj.isArray()) {
            return KeyValue.pair("0", obj.asArray().get(0));
        }
        else if (obj.isObject()) {
            return first(obj.asObject());
        }
        throw new RuntimeException();
    }
}
